/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collection;
import java.sql.Connection;
import java.sql.Date;
import modelo.Caja;

/**
 *
 * @author Felipe
 */
class CajaDAO {

    private Connection conexion;

    public Connection getConexion() {
        return conexion;
    }

    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

    public Collection<Caja> buscarTodos() {
        Collection<Caja> lista = new ArrayList<Caja>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        try {
            String sql = "select c.RUT_USUARIO, c.FECHA_APERTURA, c.FECHA_CIERRE ,C.MONTO_FINAL,C.MONTO_FINAL_GASTOS,C.MONTO_INICIO, u.NOMBRE from ADMINISTRADOR.CAJA c   join USUARIOS u using (RUT_USUARIO) ORDER BY FECHA_APERTURA";
            sentencia = conexion.prepareStatement(sql);
            System.out.println(sql);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    Caja registro = new Caja();
                    registro.setCodUsuario(resultado.getInt("RUT_USUARIO"));
                    registro.setFechaApertura(resultado.getTimestamp("FECHA_APERTURA"));
                    registro.setFechaCierre(resultado.getTimestamp("FECHA_CIERRE"));
                    registro.setMontoFinal(resultado.getInt("MONTO_FINAL"));
                    registro.setMontoInicial(resultado.getInt("MONTO_INICIO"));
                    registro.setMontoFinalGastos(resultado.getInt("MONTO_FINAL_GASTOS"));
                    registro.setNombreUsuario(resultado.getString("NOMBRE"));
                    // finalmente, agregar a la coleccion
                    lista.add(registro);
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    public void Insertar(Caja caj) {
        PreparedStatement sentencia = null;

        try {

            int montoIni = caj.getMontoInicial();
            int rutUsu = caj.getCodUsuario();
            int montoCie = caj.getMontoFinal();
            int montoGas = caj.getMontoFinalGastos();

            String sql = "insert into CAJA (RUT_USUARIO, FECHA_APERTURA, FECHA_CIERRE, MONTO_INICIO, MONTO_FINAL, MONTO_FINAL_GASTOS) values (?,?,?,?,?,?)";
            sentencia = conexion.prepareStatement(sql);

            sentencia.setInt(1, rutUsu);
            if (caj.getFechaApertura() == null) {
                sentencia.setTimestamp(2, null);
            } else {
                long fechaEnMilisegundos = caj.getFechaApertura().getTime();
                sentencia.setTimestamp(2, new Timestamp(fechaEnMilisegundos));
            }
            if (caj.getFechaCierre() == null) {
                sentencia.setTimestamp(3, null);
            } else {
                long fechaEnMilisegundos = caj.getFechaCierre().getTime();
                sentencia.setTimestamp(3, new Timestamp(fechaEnMilisegundos));
            }
            sentencia.setInt(4, montoIni);
            sentencia.setInt(5, montoCie);
            sentencia.setInt(6, montoGas);

            sentencia.executeUpdate();

        } catch (SQLException ex) {
            ex.printStackTrace();
            throw new RuntimeException("error al insertar caja", ex);
        } finally {
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }

        }

    }

    Collection<Caja> buscarPorRut(int rut) {
        Collection<Caja> lista = new ArrayList<Caja>();
        PreparedStatement sentencia = null;
        ResultSet resultado = null;

        try {
            String sql = "select c.RUT_USUARIO, c.FECHA_APERTURA, c.FECHA_CIERRE ,C.MONTO_FINAL,C.MONTO_FINAL_GASTOS,C.MONTO_INICIO, u.NOMBRE from ADMINISTRADOR.CAJA c   join USUARIOS u using (RUT_USUARIO) where RUT_USUARIO = ? ORDER BY FECHA_APERTURA";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setInt(1, rut);
            System.out.println(sql);
            resultado = sentencia.executeQuery();
            
                while (resultado.next()) {
                    Caja registro = new Caja();
                    registro.setCodUsuario(resultado.getInt("RUT_USUARIO"));
                    registro.setFechaApertura(resultado.getTimestamp("FECHA_APERTURA"));
                    registro.setFechaCierre(resultado.getTimestamp("FECHA_CIERRE"));
                    registro.setMontoFinal(resultado.getInt("MONTO_FINAL"));
                    registro.setMontoInicial(resultado.getInt("MONTO_INICIO"));
                    registro.setMontoFinalGastos(resultado.getInt("MONTO_FINAL_GASTOS"));
                    registro.setNombreUsuario(resultado.getString("NOMBRE"));
                    
                    lista.add(registro);
                }
            

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return lista;
    }

    Caja buscarCaja(int rut, String sqlfecha) {
        PreparedStatement sentencia = null;
        ResultSet resultado = null;
        Caja registro = new Caja();
        try {
            String sql = "select * from CAJA where FECHA_APERTURA = ? and RUT_USUARIO = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, sqlfecha);
            sentencia.setInt(2, rut);
            resultado = sentencia.executeQuery();
            try {
                while (resultado.next()) {
                    registro.setCodUsuario(resultado.getInt("RUT_USUARIO"));
                    registro.setFechaApertura(resultado.getTimestamp("FECHA_APERTURA"));
                    registro.setFechaCierre(resultado.getTimestamp("FECHA_CIERRE"));
                    registro.setMontoFinal(resultado.getInt("MONTO_FINAL"));
                    registro.setMontoInicial(resultado.getInt("MONTO_INICIO"));
                    registro.setMontoFinalGastos(resultado.getInt("MONTO_FINAL_GASTOS"));
                    registro.setNombreUsuario(resultado.getString("NOMBRE"));
                    
                }
            } catch (NullPointerException ex) {
                return null;

            }

        } catch (SQLException ex) {
            //TODO Gestionar mejor esta exception
            ex.printStackTrace();
        } finally {
            try {
                resultado.close();
            } catch (Exception noGestionar) {
            }
            try {
                sentencia.close();
            } catch (Exception noGestionar) {
            }
        }
        return registro;
    }

    void eliminar(int rut,String fecha) {
        PreparedStatement sentencia = null;
        try {

            String sql = "DELETE FROM CAJA  WHERE FECHA_APERTURA = ? and RUT_USUARIO = ?";
            sentencia = conexion.prepareStatement(sql);
            sentencia.setString(1, fecha);
            sentencia.setInt(2, rut);
            sentencia.executeUpdate();

        } catch (SQLException ex) {
            throw new RuntimeException("no se pudo eliminar Caja", ex);

        }
    }
    
}
